package Dimensionnement;

import hibernate.FournisseurProduit;
import hibernate.HibernateUtil;
import hibernate.HistoriqueVentes;
import hibernate.Prevision;
import hibernate.Produit;
import hibernate.Reseau;
import hibernate.Site;
import hibernate.StockSecu;
import hibernate.siteProduit;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;



import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

public class TraitementDonnees {

	int T, D, Prev, Historique, conso;
	Session session ;
	//private static Logger logger = Logger.getLogger(TraitementDonnees.class
		
//.getName());
	
	
	public TraitementDonnees() throws HibernateException
	{
		 session = HibernateUtil.currentSession();
	}

	/**
	 * 
	 * cette fonction revoie le type du site elle est utilisée dans l'affichage
	 * plus
	 * 
	 * @param id_site
	 * @return
	 * @throws HibernateException
	 * 
	 * 
	 */
	public String selectTypeSite(int id_site) throws HibernateException {

		Site site = null;
		//Session session = HibernateUtil.currentSession();
		//logger.info("le site= " + id_site);

		List<?> listR = session.find("from Site where id_site =" + id_site);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			site = (Site) itR.next();

		}
		if (site != null) {

			//logger.info("le type du site = " + site.getTypeSite());

			return site.getTypeSite();
		}
		//logger.warning("--valeur nulle");
		return null;

	}

	/***
	 * Cette fonction renvoi le site
	 * 
	 * @param id_site
	 * @param id_produit
	 * @return
	 * @throws HibernateException
	 */

	public siteProduit recuperer_site(int id_site, int id_produit)
			throws HibernateException {

		siteProduit site = null;
		//Session session = HibernateUtil.currentSession();

		List<?> listR = session.find("from siteProduit where id_site ="
				+ id_site + "and id_produit =" + id_produit);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			site = (siteProduit) itR.next();

		}

		return site;

	}

	// change

	public int recuperer_prevision(int b, int p, Date date)
			throws HibernateException {

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		//logger.info("le site =" + b);

		String typesite = selectTypeSite(b);

		if (typesite.equals("boutique") || typesite.equals("supermarche")) {
			int id_site = b;

			int id_produit = p;
			Prevision prev = null;
		//	Session session = HibernateUtil.currentSession();
			int quant = 0;
			List<?> listR = session.find("from Prevision  where id_site =" + id_site
					+ " and id_produit=" + id_produit);

			Iterator<?> itR = listR.iterator();
			while (itR.hasNext()) {

				prev = (Prevision) itR.next();
				// la date recupere de la base est sous ce format 2012-03-08
				// Annee
				String year1 = dateFormat.format(prev.getDate());
				year1 = year1.substring(0, 4);
				int year2 = date.getYear();

				// Mois
				String mois1 = dateFormat.format(prev.getDate());
				mois1 = mois1.substring(6, 7);
				int mois2 = date.getMonth() + 1;
				if (Integer.parseInt(year1) == year2
						&& Integer.parseInt(mois1) == mois2) {
					quant = prev.getQuantite();

					return quant;
				}
			}// fin while

		} else {
			if (typesite.equals("depot")) {
			//	System.out
			//			.println("***********addition des prévision des sites que ce dépot sert************");
				Reseau reseau = null;
				int id_site = b;
				int id_produit = p;
				int quantite = 0;
			//	Session session = HibernateUtil.currentSession();
				List<?> listDestination = session
						.find("from Reseau  where id_source =" + id_site
								+ " and id_produit=" + id_produit);

				Iterator<?> itDestination = listDestination.iterator();
				while (itDestination.hasNext()) {

					reseau = (Reseau) itDestination.next();
					int id_dest = reseau.getIdSite();

					siteProduit monsite = recuperer_site(id_dest, id_produit);

					if (monsite != null)
						quantite = quantite
								+ recuperer_prevision(monsite.getIdSite(), p,
										date);

				}

				//System.out.println("***********La prévision total de dépot : "
					//	+ b + "=" + quantite + "*******************");

				return quantite;

			}
		}
		//System.out
			//	.println("[Traiter_Donnees>Fonction (5)] ****pas de prévisions pour le site : "
					//	+ b);
		return 0;

	}

	public int recuperer_D(int b, int p) throws HibernateException {

		int id_site = b;
		Reseau res = null;
		int id_produit = p;
		//Session session = HibernateUtil.currentSession();

		List<?> listR = session.find("from Reseau where id_site =" + id_site
				+ " and id_produit=" + id_produit);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res = (Reseau) itR.next();

		}
		if (res != null) {
			return res.getD();
		}
		//logger.warning("Impossible --de calcul D");
		return 0;

	}

	public int recuperer_T(int b, int p) throws HibernateException {

		int id_site = b;
		Reseau res = null;
		int id_produit = p;
	//	Session session = HibernateUtil.currentSession();
		List<?> listR = session.find("from Reseau  where id_site =" + id_site
				+ " and id_produit=" + id_produit);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res = (Reseau) itR.next();

		}
		if (res != null) {
			return res.getT();
		}
		//logger.warning("Impossible --de calcul D");
		return 0;
	}

	public StockSecu recuperer_StockSecu(int site, int produit)
			throws HibernateException {

		StockSecu stock = null;

		//Session session = HibernateUtil.currentSession();
		List<?> listR = session.find("from StockSecu where id_site =" + site
				+ " and id_produit=" + produit);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			stock = (StockSecu) itR.next();

		}

		return stock;

	}

	public int recuperer_Historique(int b, int p, Date date)
			throws HibernateException {

		DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd",
				Locale.FRANCE);
		int id_site = b;
		HistoriqueVentes hist = null;
		int id_produit = p;
		//Session session = HibernateUtil.currentSession();
		int quant = 0;
		List<?> listR = session.find("from HistoriqueVentes  where id_site ="
				+ id_site + " and id_produit=" + id_produit);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {

			hist = (HistoriqueVentes) itR.next();
			// la date recupere de la base est sous ce format 2012-03-08
			// Annee
			String year1 = dateFormat.format(hist.getDate());
			year1 = year1.substring(0, 4);
			int year2 = date.getYear();

			// Mois
			String mois1 = dateFormat.format(hist.getDate());
			mois1 = mois1.substring(6, 7);
			int mois2 = date.getMonth() + 1;
			if (Integer.parseInt(year1) == year2
					&& Integer.parseInt(mois1) == mois2) {
				quant = hist.getQuantite();

				return quant;

			}
		}

		//System.out.println("-------------------l'historique = -1");
		return -1;
	}

	/**
	 * cette fonction insert en base le stock secu
	 * 
	 * @param site
	 * @param produit
	 * @param quantite
	 * @throws HibernateException
	 */
	public void InsererStock(int site, int produit, int quantite)
			throws HibernateException

	{

		// recuperer la source du produit
		//Session session = HibernateUtil.currentSession();
		net.sf.hibernate.Transaction tx = session.beginTransaction();
		StockSecu stock = new StockSecu();
		List<?> listR = session.find("from StockSecu where id_site =" + site
				+ " and id_produit=" + produit);
		//logger.info("stock site renvoyééééé===" + site);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			stock = (StockSecu) itR.next();
			//logger.info("stock produit===" + stock.getIdProduit());
		}

		if (stock.getIdProduit() != null) {
			//logger.info("stock site===" + stock.getIdSite());
			if (stock.getIdSite() != null) {
				stock.setStocksecu(quantite);
				session.save(stock);
				System.out.println("stock pas nul pas de nouveau");
				//logger.info("Enregistrement base OK");
				tx.commit();
			} //else
				//logger.info("get id nullllllllllllllll");

		} else if (stock.getIdProduit() == null) {

			InsererStock_new(site, produit, quantite);
			System.out.println("stock pas nul pas de nouveau");
		}

	}

	public void InsererStock_new(int site, int produit, int quantite)
			throws HibernateException {

	//	Session session = HibernateUtil.currentSession();
		net.sf.hibernate.Transaction tx = session.beginTransaction();
		StockSecu stock = new StockSecu();
		//logger.info("le site =" + site);
		stock.setIdProduit(produit);
		stock.setIdSite(site);
		//logger.info("produit =" + produit);
		stock.setStocksecu(quantite);
		session.save(stock);
		//logger.info("Creation 1er Enregistrement OK");
		tx.commit();

	}

	public Site recuperer_infosite(int s) throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		Site res = new Site();
		List<?> listR = session.find("from Site where id_site =" + s);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res = (Site) itR.next();

		}
		return res;

	}

	public Produit recuperer_infoproduit(int p) throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		Produit res = new Produit();
		List<?> listR = session.find("from Produit where id_produit =" + p);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res = (Produit) itR.next();

		}
		return res;

	}

	public List<Site> recuperer_Lessite() throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		List<Site> res = new ArrayList<Site>();
		List<?> listR = session.find("from Site");

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res.add((Site) itR.next());

		}
		return res;

	}

	public List<Produit> recuperer_Lesproduit() throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		List<Produit> res = new ArrayList<Produit>();
		List<?> listR = session.find("from Produit");

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res.add((Produit) itR.next());

		}
		return res;

	}

	public List<Prevision> recuperer_ToutesPrev(int s, int p)
			throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		List<Prevision> res = new ArrayList<Prevision>();
		List<?> listR = session.find("from Prevision  where id_site =" + s
				+ " and id_produit=" + p);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res.add((Prevision) itR.next());

		}
		return res;

	}

	public List<HistoriqueVentes> recuperer_ToutesHisto(int s, int p)
			throws HibernateException {

		//Session session = HibernateUtil.currentSession();
		List<HistoriqueVentes> res = new ArrayList<HistoriqueVentes>();
		List<?> listR = session.find("from HistoriqueVentes  where id_site ="
				+ s + " and id_produit=" + p);

		Iterator<?> itR = listR.iterator();
		while (itR.hasNext()) {
			res.add((HistoriqueVentes) itR.next());

		}
		return res;

	}

	public String recupererClasse(int id_produit, int id_site)
			throws HibernateException

	{
		String classe = "x";
		//Session session = HibernateUtil.currentSession();
		List<?> listSP = session.find("from siteProduit where id_produit ="
				+ id_produit + "and id_site =" + id_site);

		Iterator<?> itCP = listSP.iterator();
		siteProduit CP = new siteProduit();
		// itCP.hasNext();
		while (itCP.hasNext()) {
			CP = (siteProduit) itCP.next();

			classe = CP.getClasseActuelle();
		}
	//	System.out.println("classe" + classe);
		return classe;

	}

}
